package com.cetool.autocms.util;

import com.cetool.autocms.common.BaseResponse;
import com.cetool.autocms.enumeration.OperateEnum;

/**
 * 响应包装工具类
 *
 * @author 端木超群
 * @date 2021/11/01
 */
public final class BaseResponseUtil {
    /**
     * 操作成功标志
     */
    private static final Boolean SUCCESS_FLAG = true;

    /**
     * 操作失败标志
     */
    private static final Boolean FAIL_FLAG = false;

    /**
     * 成功编码(写操作、读操作成功)
     */
    private static final String SUCCESS_CODE = "00000";

    /**
     * 成功描述
     */
    private static final String SUCCESS_DESC = "操作成功";

    /**
     * 构造器私有，防止外部实例化
     */
    private BaseResponseUtil() {
    }

    /**
     * 包装响应对象，此方法适用写操作没有数据实体场景下调用
     *
     * @param operateEnum 全局枚举常量对象
     * @return 全局数据包装响应对象
     */
    public static BaseResponse<Object> success(OperateEnum operateEnum) {
        return success().setCode(operateEnum.getCode()).setMessage(operateEnum.getMessage());
    }

    /**
     * 包装响应对象，此方法适用查询操作有数据实体场景下调用
     *
     * @param data 全局枚举常量对象
     * @return 全局数据包装响应对象
     */
    public static BaseResponse<Object> success(Object data) {
        return success().setCode(SUCCESS_CODE).setMessage(SUCCESS_DESC).setData(data);
    }

    /**
     * 设置成功标志位
     *
     * @return 全局数据包装响应对象
     */
    public static BaseResponse<Object> success() {
        return new BaseResponse<>().setFlag(SUCCESS_FLAG);
    }

    /**
     * 包装响应对象，此方法适合系统发生异常(校验框架异常、自定义异常、系统异常)场景下调用
     *
     * @param code    异常编码
     * @param message 异常信息
     * @return 全局数据包装响应对象
     */
    public static BaseResponse<Object> fail(String code, String message) {
        return fail().setCode(code).setMessage(message);
    }

    /**
     * 设置失败标志位
     *
     * @return 全局数据包装响应对象
     */
    public static BaseResponse<Object> fail() {
        return new BaseResponse<>().setFlag(FAIL_FLAG);
    }
}
